package com.bit.cfdi.web.dao.impl;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.bit.cfdi.web.dao.NegocioDAO;
import com.bit.cfdi.web.domain.CampoExtraComprobante;
import com.bit.cfdi.web.domain.Negocio;

@Repository
public class NegocioDAOImpl extends HibernateDaoSupport implements NegocioDAO {

	@Autowired
	public void init(final SessionFactory sessionFactory) {		
		setSessionFactory(sessionFactory);
	}
	
	@Transactional @Override	public void save(final Negocio negocio) {
		getHibernateTemplate().saveOrUpdate(negocio);
	}
	
	@SuppressWarnings("unchecked")
	@Override
	@Transactional public Negocio findNegocio(String rfc, String nombreNegocio,
			String razonSocial) throws DataAccessException {
		List<Negocio> negocios = getHibernateTemplate().find(
				" from Negocio as negocio" +
				" where negocio.datosFiscales.rfc=?" +
				" and negocio.nombre=?" +
				" and negocio.datosFiscales.razon=?",
				rfc, nombreNegocio, razonSocial);
		return negocios.size()>0?negocios.get(0):null;
	}

	@SuppressWarnings("unchecked")
	@Override	
	@Transactional public List<Negocio> getAll() throws DataAccessException {
		List<Negocio> negocios = getHibernateTemplate().find(
				" from Negocio as negocio");
		return negocios;
	}

	@SuppressWarnings("unchecked")
	@Override
	@Transactional public Set<CampoExtraComprobante> getCamposExtras(Negocio negocio) throws DataAccessException {		
		Set<CampoExtraComprobante> camposExtras = new HashSet<CampoExtraComprobante>( getHibernateTemplate().
													find("select neg.camposExtraComprobante from Negocio as " +
															"neg where neg.idNegocio = ? ", negocio.getIdNegocio()) );
		
		return camposExtras;
	}

	@SuppressWarnings("unchecked")
	@Override
	@Transactional public List<Negocio> findNegocioWithRFCRazon(String rfc, String razonSocial) throws DataAccessException {
		List<Negocio> negocios = getHibernateTemplate().find(
				" from Negocio as negocio" +
				" where negocio.datosFiscales.rfc=?" +
				" and negocio.datosFiscales.razon=?",
				rfc, razonSocial);
		return negocios;
	}

}
